/*
*******************************************************************************
*                     《手把手教你学51单片机(C语言版)》
* 文件名：main.c
* 描  述：第5章 课后练习
* 版本号：v1.0.0
* 备  注：利用定时器来显示F到1
*******************************************************************************
*/
#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

//用数组来存储数码管的真值表，使用code将数据存到Flash中
unsigned char code LEDChar[] = {
	0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
	0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void main()
{
	//声明语句
	unsigned char cnt = 0;	//记录定时器T0溢出中断次数
	unsigned char sec = 16;	//记录经过的秒数
	//执行语句
	ENLED = 0;	//使能U3（74HC138）
	ADDR3 = 1;	//使能LEDS0，让DS1所在的三极管Q17导通
	ADDR2 = 0;
	ADDR1 = 0;
	ADDR0 = 0;
	
	TMOD = 0x01;	//设置T0为工作模式1
	TH0 = 0xB8;	//定时器0.02s
	TL0 = 0x00;
	TR0 = 1;	//启动T0
	while(1)
	{
		if(TF0 == 1)	//判断定时器是否溢出
		{
			TF0 = 0;	//定时器溢出后要清除标志（软件清零）
			TH0 = 0xB8;	//定时器溢出会从0开始计，所以要重新赋值
			TL0 = 0x00;
			cnt++;
			if(cnt >= 50)	//T0溢出50次就达到1秒了
			{
				cnt = 0;
				sec--;	//经过了1秒要减一
				P0 = LEDChar[sec];
				if(sec <= 0)	//如果秒数小于0，重新从16开始
				{
					sec = 16;
				}
			}
		}
	}
}